package internal
//
//import (
//	"math/rand"
//	"strconv"
//	"time"
//
//	"game-server/base"
//	"game-server/log"
//	"game-server/msg"
//	"github.com/name5566/leaf/gate"
//)
//
//// 生成随机数字
//func randNum(n, b, k int) string {
//	r := rand.New(rand.NewSource(time.Now().UnixNano() + int64(k)))
//	//log.Info("randnum = ", n, b, r.Intn(n) + b)
//	return strconv.Itoa(r.Intn(n) + b)
//}
//
//// 生成随机牌组 n:基数 num:重复次数
//func pInfo(str []string, n, num int) []string {
//	var ss []string
//	if len(str) > 0 {
//		ss = append(ss, str...)
//
//		for _, v := range str {
//			for i := 0; i < num; i++ {
//				ss = append(ss, v)
//			}
//		}
//	}
//
//	if n >= 4 && n != 5 {
//		// 顺子
//		for i := 0; i < n; i++ {
//			iNum, _ := strconv.ParseInt(str[i], 10, 64)
//			if iNum == 14 {
//				bbb, _ := strconv.ParseInt(str[0], 10, 64)
//				iNum = int64(int(bbb) - n - 2 + len(str))
//				log.Info(" new num = ", iNum)
//			}
//			other := randNum(1, (int(iNum) + 1), i)
//			log.Info(" num = ", other)
//			str = append(str, other)
//			ii, _ := strconv.ParseInt(other, 10, 64)
//			if ii == 14 {
//				other = strconv.FormatInt((ii - 13), 10)
//			}
//			ss = append(ss, other)
//		}
//	} else {
//		for i := 0; i < n; i++ {
//		RAND:
//			other := randNum(13, 1, i)
//			for _, v := range ss {
//				if other == v {
//					goto RAND
//				}
//			}
//			ss = append(ss, other)
//		}
//	}
//
//	return ss
//}
//
//// 设置花色
//func color(str []string, d string) []string {
//	var ss []string
//	for k, v := range str {
//		var s, c string
//		if d != "" {
//			c = d
//		} else {
//			log.Info("color = ", k, c)
//			c = randNum(4, 0, k)
//			log.Info("color = ", k, c)
//		}
//
//		i, _ := strconv.ParseInt(v, 10, 64)
//		if i >= 10 {
//			s = c + v
//		} else {
//			s = c + "0" + v
//		}
//		ss = append(ss, s)
//	}
//	return ss
//}
//
//// 单张
//func one(i int) []string {
//	var one []string
//
//	if i == 2 {
//		num1 := randNum(9, 2, 1)
//		num2 := randNum(3, 11, 2)
//		one = append(one, "1", num1, num2)
//	} else if i == 1 {
//		for ii := 0; ii < 2; ii++ {
//		ONE1:
//			other := randNum(9, 2, ii)
//			for _, v := range one {
//				if other == v {
//					goto ONE1
//				}
//			}
//			one = append(one, other)
//		}
//		other := randNum(3, 11, 3)
//		one = append(one, other)
//	} else {
//		for ii := 0; ii < 3; ii++ {
//		ONE:
//			other := randNum(9, 2, ii)
//			for _, v := range one {
//				if other == v {
//					goto ONE
//				}
//			}
//			one = append(one, other)
//		}
//	}
//	log.Info("one = ", one)
//	one = color(one, "")
//	log.Info("one = ", one)
//	return one
//}
//
//// 对子 i: 1 小对子 2 大对子 其他 正常
//func two(i int) []string {
//	var two []string
//
//	if i == 1 {
//		num := randNum(8, 2, i)
//		two = append(two, num)
//		i = 1
//	} else if i == 2 {
//		num := randNum(5, 10, i)
//		if num == "14" {
//			num = string(num[0])
//		}
//		two = append(two, num)
//		i = 1
//	} else {
//		two = pInfo(two, 1, 0)
//		i = 3
//	}
//
//	two = pInfo(two, i, 1)
//	log.Info("two = ", two)
//	two = color(two, "")
//	log.Info("two = ", two)
//	return two
//}
//
//// 两对
//func twice() []string {
//	var twice []string
//
//	d := pInfo(twice, 2, 0)
//	twice = pInfo(d, 1, 1)
//	log.Info("twice = ", twice)
//	twice = color(twice, "")
//	log.Info("twice = ", twice)
//	return twice
//}
//
//// 三张 new: 0 冲三 2 三张
//func three(new int) []string {
//	var three []string
//
//	d := pInfo(three, 1, 0)
//	three = pInfo(d, new, 2)
//	log.Info("three = ", three)
//	three = color(three, "")
//	log.Info("three = ", three)
//	return three
//}
//
//// 顺子
//func straight() []string {
//	var straight []string
//
//	d := pInfo(straight, 1, 0)
//	straight = pInfo(d, 4, 0)
//	log.Info("straight = ", straight)
//	straight = color(straight, "")
//	log.Info("straight = ", straight)
//	return straight
//}
//
//// 同花
//func flush() []string {
//	var flush []string
//
//	flush = pInfo(flush, 5, 0)
//	log.Info("flush = ", flush)
//	flush = color(flush, randNum(4, 0, 1))
//	log.Info("flush = ", flush)
//	return flush
//}
//
//// 葫芦
//func gourd() []string {
//	var gourd []string
//
//	d := pInfo(gourd, 2, 0)
//	gourd = pInfo(d, 0, 1)
//	gourd = append(gourd, d[0])
//	log.Info("gourd = ", gourd)
//	gourd = color(gourd, "")
//	log.Info("gourd = ", gourd)
//	return gourd
//}
//
//// 铁支
//func four() []string {
//	var four []string
//
//	d := pInfo(four, 1, 0)
//	four = pInfo(d, 1, 3)
//	log.Info("four = ", four)
//	four = color(four, "")
//	log.Info("four = ", four)
//	return four
//}
//
//// 同花顺
//func flushStraight() []string {
//	var flushStraight []string
//
//	d := pInfo(flushStraight, 1, 0)
//	flushStraight = pInfo(d, 4, 0)
//	log.Info("flushStraight = ", flushStraight)
//	flushStraight = color(flushStraight, randNum(4, 0, 1))
//	log.Info("flushStraight = ", flushStraight)
//	return flushStraight
//}
//
//// 五同
//func five() []string {
//	var five []string
//
//	d := pInfo(five, 1, 0)
//	five = pInfo(d, 0, 4)
//	log.Info("five = ", five)
//	five = color(five, "")
//	log.Info("five = ", five)
//	return five
//}
//
//// 头墩牌型生成
//func head(n int, pokers []string) (string, []string, []string) {
//HEAD:
//	head := []string{}
//	tmp := []string{}
//	num := randNum((6 - n), n, 1)
//	switch num {
//	case "5":
//		head = three(0)
//	case "4":
//		head = two(2)
//	case "3":
//		head = two(1)
//	case "2":
//		head = one(2)
//	case "1":
//		head = one(1)
//	case "0":
//		head = one(0)
//	}
//	log.Info("head = ", head)
//
//	ct := 0
//	tmp = append([]string{}, pokers...)
//	log.Info("HEAD tmp = ", len(tmp))
//	for _, v := range head {
//		log.Info("HEAD ----- ", tmp, head)
//		for k, val := range tmp {
//			if val == v {
//				kk := k + 1
//				tmp = append(tmp[:k], tmp[kk:]...)
//				ct++
//				k = -1
//				break
//			} else {
//				continue
//			}
//		}
//	}
//
//	if ct == len(head) {
//		pokers = tmp
//	} else {
//		log.Info("HEAD new one ")
//		goto HEAD
//	}
//
//	return num, head, pokers
//}
//
//// 中墩、尾墩牌型生成
//func middleTail(p, n int, pokers []string) (string, []string, []string) {
//MT:
//	rNum := 10 - n
//	bNum := n + 1
//	if len(pokers) > (54 - p*5) {
//		rNum = 11 - n
//	} else {
//		if bNum == 11 {
//			bNum = 10
//		}
//	}
//
//	if rNum == 0 {
//		rNum = 1
//	}
//
//	middle := []string{}
//	tmp := []string{}
//	num := randNum(rNum, bNum, 1)
//	log.Info(" ==== ", p, n, rNum, bNum, num)
//	switch num {
//	case "11":
//		middle = five()
//	case "10":
//		middle = flushStraight()
//	case "9":
//		middle = four()
//	case "8":
//		middle = gourd()
//	case "7":
//		middle = flush()
//	case "6":
//		middle = straight()
//	case "5":
//		middle = three(2)
//	case "4":
//		middle = twice()
//	case "3":
//		middle = two(0)
//	case "2":
//		middle = pInfo(middle, 5, 0)
//	}
//	log.Info("middle = ", middle)
//
//	ct := 0
//	tmp = append([]string{}, pokers...)
//	log.Info("MT tmp = ", len(tmp))
//	for _, v := range middle {
//		log.Info("MT ----- ", tmp, middle)
//		for k, val := range tmp {
//			if val == v {
//				kk := k + 1
//				tmp = append(tmp[:k], tmp[kk:]...)
//				ct++
//				k = -1
//				break
//			}
//		}
//	}
//
//	if ct == len(middle) {
//		pokers = tmp
//	} else if ct != 6 {
//		log.Info("MT new one ")
//		goto MT
//	}
//
//	return num, middle, pokers
//}
//
//func makePoker(msgWg base.WinGame, roomNo int32) (int, int32) {
//	userId := msgWg.Master
//	person := msgWg.Person
//	round := msgWg.Round
//	addPoker := msgWg.AddPoker
//	payAll := msgWg.PayAll
//	power := msgWg.Power
//	oid := msgWg.Oid
//	mPoker := msgWg.MPoker
//	gPoker := msgWg.GPoker
//	multi := msgWg.Multiple
//
//	sNum := 0
//	log.Info("MakePoker: userId = ", userId)
//	log.Info("MakePoker: person = ", person)
//	log.Info("MakePoker: round = ", round)
//	log.Info("MakePoker: addPoker = ", addPoker)
//	log.Info("MakePoker: payAll = ", payAll)
//	log.Info("MakePoker: power = ", power)
//	log.Info("MakePoker: mPoker = ", mPoker)
//	log.Info("MakePoker: gPoker = ", gPoker)
//	log.Info("MakePoker: multi = ", multi)
//
//	for _, v := range power {
//		if v.GoodCard > 0 {
//			strRound := []string{}
//			for ii := 0; ii < int(v.GoodCard); ii++ {
//			RAND:
//				other := randNum(int(round), 1, ii)
//				for _, v := range strRound {
//					if other == v {
//						goto RAND
//					}
//				}
//				strRound = append(strRound, other)
//			}
//			log.Info("MakePoker: strRound = ", strRound)
//			for i := 0; i < int(v.GoodCard); i++ {
//				roundId, _ := strconv.ParseInt(strRound[i], 10, 64)
//
//				var str, all []string
//				all = append(all, allPokers...)
//				if addPoker == 1 {
//					all = append(all, diamonds...)
//				}
//				if addPoker == 2 {
//					all = append(all, diamonds...)
//					all = append(all, plum...)
//				}
//				log.Info("MakePoker: poker = ", all)
//
//				// 头墩
//				num1, h, all := head(3, all)
//				log.Info("pokers11 = ", num1)
//				if num1 == "0" {
//					num1 = "1"
//				}
//				iNum1, _ := strconv.ParseInt(num1, 10, 64)
//				log.Info("pokers1 = ", num1, len(all), all, h)
//
//				num2, m, all := middleTail(1, int(iNum1), all)
//				iNum2, _ := strconv.ParseInt(num2, 10, 64)
//				log.Info("pokers2 = ", num2, len(all), all, m, iNum2)
//
//				num3, t, all := middleTail(2, int(iNum2), all)
//				iNum3, _ := strconv.ParseInt(num3, 10, 64)
//				log.Info("pokers3 = ", num3, len(all), all, t, iNum3)
//
//				str = append(str, h...)
//				str = append(str, m...)
//				str = append(str, t...)
//				log.Info(" str = ", str, num1, num2, num3)
//
//				if len(str) == 13 {
//					pInfo := base.PokerInfo{
//						UserId:   v.GameUserId,
//						Master:   userId,
//						Person:   person,
//						Round:    round,
//						RoundId:  int32(roundId),
//						AddPoker: addPoker,
//						PayAll:   payAll,
//						Oid:      oid,
//						Poker:    str,
//						MPoker:   mPoker,
//						GPoker:   gPoker,
//						Multiple: multi,
//					}
//
//					var pInfos []base.PokerInfo
//					ok := base.IsExist("poker", roomNo)
//					log.Debug("MakePoker: poker ok = ", ok)
//					if ok {
//						log.Debug("poker = ", base.Get("poker", roomNo))
//						pInfos = append(pInfos, base.Get("poker", roomNo).([]base.PokerInfo)...)
//						log.Debug("poker = ", pInfos)
//					}
//					pInfos = append(pInfos, pInfo)
//					base.Put("poker", roomNo, pInfos)
//					base.Incr("poker")
//					sNum++
//					log.Debug("MakePoker: poker = ", pInfos)
//				} else {
//					log.Debug("MakePoker: err str = ", userId, str)
//				}
//			}
//		}
//	}
//	base.PokerList = append(base.PokerList, roomNo)
//
//	return sNum, roomNo
//}
//
//// 胜局设置
//func handleWinGame(args []interface{}) {
//	message := args[0].(*msg.MsgWinGame)
//	conn := args[1].(gate.Agent)
//
//	wgInfo := []base.WinGame{}
//	isExist := base.IsExist("winGame", message.GetUserId())
//	if isExist {
//		wgs := base.Get("winGame", message.GetUserId()).([]base.WinGame)
//		wgInfo = append(wgInfo, wgs...)
//	}
//	log.Info("winGame: add info = ", wgInfo)
//
//	players := []base.Player{}
//	for _, v := range message.GetPower() {
//		p := base.Player{
//			GameUserId: v.GameUserId,
//			GoodCard:   v.GoodCard,
//		}
//		players = append(players, p)
//	}
//	wG := base.WinGame{
//		Master:   message.GetUserId(),
//		Round:    message.GetRound(),
//		Person:   message.GetPerson(),
//		PayAll:   message.GetPayAll(),
//		AddPoker: message.GetPoker(),
//		Power:    players,
//		Oid:      message.GetOid(),
//		MPoker:   message.GetMPoker(),
//		GPoker:   message.GetGPoker(),
//		Multiple: message.GetMultiple(),
//	}
//	wgInfo = append(wgInfo, wG)
//
//	base.Put("winGame", message.GetUserId(), wgInfo)
//	log.Info("winGame: add info = ", base.Get("winGame", message.GetUserId()))
//
//	pongMsg := &msg.MsgError{
//		ErrNo: 200,
//		Desc:  "pong",
//	}
//
//	conn.WriteMsg(pongMsg)
//}
//
//// 删除胜局设置
//func handleDelWinGame(args []interface{}) {
//	message := args[0].(*msg.MsgDelWinGame)
//	conn := args[1].(gate.Agent)
//
//	pongMsg := &msg.MsgError{}
//	isExist := base.IsExist("winGame", message.GetMaster())
//	if isExist {
//		wgInfo := base.Get("winGame", message.GetMaster()).([]base.WinGame)
//		log.Info("winGame: del info = ", wgInfo)
//
//		for k, v := range wgInfo {
//			if v.Oid == message.GetOid() {
//				kk := k + 1
//				wgInfo = append(wgInfo[:k], wgInfo[kk:]...)
//				break
//			}
//		}
//		base.Put("winGame", message.GetMaster(), wgInfo)
//		log.Info("winGame: info = ", base.Get("winGame", message.GetMaster()))
//
//		pongMsg = &msg.MsgError{
//			ErrNo: 200,
//			Desc:  "pong",
//		}
//	} else {
//		pongMsg = &msg.MsgError{
//			ErrNo: 500,
//			Desc:  "no exist!",
//		}
//	}
//
//	conn.WriteMsg(pongMsg)
//}
//
//func makeGoodPoker(msgWg base.WinGame, roomNo int32, roundId int32) (int, int32) {
//	userId := msgWg.Master
//	person := msgWg.Person
//	round := msgWg.Round
//	addPoker := msgWg.AddPoker
//	payAll := msgWg.PayAll
//	power := msgWg.Power
//	oid := msgWg.Oid
//	mPoker := msgWg.MPoker
//	gPoker := msgWg.GPoker
//	multi := msgWg.Multiple
//
//	sNum := 0
//	log.Info("MakePoker: userId = ", userId)
//	log.Info("MakePoker: person = ", person)
//	log.Info("MakePoker: round = ", round)
//	log.Info("MakePoker: addPoker = ", addPoker)
//	log.Info("MakePoker: payAll = ", payAll)
//	log.Info("MakePoker: power = ", power)
//	log.Info("MakePoker: mPoker = ", mPoker)
//	log.Info("MakePoker: gPoker = ", gPoker)
//	log.Info("MakePoker: multi = ", multi)
//
//	for _, v := range power {
//		if v.GoodCard > 0 {
//			for i := 0; i < int(v.GoodCard); i++ {
//				var str, all []string
//				all = append(all, allPokers...)
//				if addPoker == 1 {
//					all = append(all, diamonds...)
//				}
//				if addPoker == 2 {
//					all = append(all, diamonds...)
//					all = append(all, plum...)
//				}
//				log.Info("MakePoker: poker = ", all)
//
//				// 头墩
//				num1, h, all := head(3, all)
//				log.Info("pokers11 = ", num1)
//				if num1 == "0" {
//					num1 = "1"
//				}
//				iNum1, _ := strconv.ParseInt(num1, 10, 64)
//				log.Info("pokers1 = ", num1, len(all), all, h)
//
//				num2, m, all := middleTail(1, int(iNum1), all)
//				iNum2, _ := strconv.ParseInt(num2, 10, 64)
//				log.Info("pokers2 = ", num2, len(all), all, m, iNum2)
//
//				num3, t, all := middleTail(2, int(iNum2), all)
//				iNum3, _ := strconv.ParseInt(num3, 10, 64)
//				log.Info("pokers3 = ", num3, len(all), all, t, iNum3)
//
//				str = append(str, h...)
//				str = append(str, m...)
//				str = append(str, t...)
//				log.Info(" str = ", str, num1, num2, num3)
//
//				if len(str) == 13 {
//					pInfo := base.PokerInfo{
//						UserId:   v.GameUserId,
//						Master:   userId,
//						Person:   person,
//						Round:    round,
//						RoundId:  roundId,
//						AddPoker: addPoker,
//						PayAll:   payAll,
//						Oid:      oid,
//						Poker:    str,
//						MPoker:   mPoker,
//						GPoker:   gPoker,
//						Multiple: multi,
//					}
//
//					var pInfos []base.PokerInfo
//					ok := base.IsExist("poker", roomNo)
//					log.Debug("MakePoker: poker ok = ", ok)
//					if ok {
//						log.Debug("poker = ", base.Get("poker", roomNo))
//						pInfos = append(pInfos, base.Get("poker", roomNo).([]base.PokerInfo)...)
//						log.Debug("poker = ", pInfos)
//					}
//					pInfos = append(pInfos, pInfo)
//					base.Put("poker", roomNo, pInfos)
//					base.Incr("poker")
//					sNum++
//					log.Debug("MakePoker: poker = ", pInfos)
//				} else {
//					log.Debug("MakePoker: err str = ", userId, str)
//				}
//			}
//		}
//	}
//	base.PokerList = append(base.PokerList, roomNo)
//
//	return sNum, roomNo
//}
